跟着JSPang学习egg.js笔记
JsPang原文地址:http://jspang.com/detailed?id=79
初始化项目
安装yarn
npm i -g yarn
创建目录并进入
mkdir egg
cd egg
创建egg项目
yarn create egg --type=simple
安装依赖
yarn install
运行
yarn dev // 调试
// 127.0.0.1:7001
get和post请求传参
get请求
自由传参
- 不在router中定义传参
- 在Controller中 获取: ctx.query
严格传参
router中定义: “/my/:name/:age”
在Controller中 获取: ctx.params.name ctx.params.age
post 请求
关闭csrf
config.security = {
csrf: {
enable: false
}
}
// service
ejs
安装
yarn add egg-view-ejs
配置
plugin.js
exports.ejs = {
enable: true,
package: 'egg-view-ejs'
}
config.default.js
config.view = {
mapping: {
".html": "ejs", // 所有html文件用ejs模板
}
};
config.ejs = {
delimiter: '${content}#x27;, // 更改ejs模板默认分隔符,原本是%
}
简单使用
新建html文件
app/view/index.html
controller渲染刚才创建的文件
await ctx.render('index.html', {data})
html中显示controller中的数据: <%= id %>
循环展示列表数据:
<% for(var i = 0; i<arr.length; i ++){ %>
<li><%= arr[i] %></li>
<% } %>
引入公共html
<% include header.html %>
静态资源
app/public — css/js/img
引入静态资源
<link rel="stylesheet" type="text/css" href="public/css/default.css" />
更改静态资源url访问前缀名称
config.default.js
config.static = {
prefix: '/assets/', // 原本默认是public
}
cookie 操作
// 增加
ctx.cookies.set('key', 'value', 'options')
// options
{
maxAge: 1000 * 2, // 毫秒
httpOnly: false, // 只能在服务端操作cookie,默认true
encrypt: true // 加密, 原不支持中文cookie
}
// 删除
ctx.cookies.set('key', null)
// 获取
ctx.cookies.get('key')
// 获取加密后的
ctx.cookies.get('key', {encrypt:true})
session 操作,支持中文
// 设置
ctx.session.username = 'aaa'
// 修改
ctx.session.username = 'ssss'
// 查看
ctx.session.username
// 删除
ctx.session.username = null
全局更改session配置
config.default.js
config.session = {
key: 'CUSTOM_SESS', // 更改session默认的cookie键名称
httpOnly: false, // 只服务端可修改
maxAge: 1000 * 1, // 过期时间
renew: true, // 访问页面/交互 自动刷新过期时间
}
中间件app/middleware
//定义
// app/middleware/couter.js
module.export = option => {
retuen async (ctx, next) {
// todo...
await next()
}
}
// 全局使用
config/config.default.js
config.middleware = ['couter']
// 局部使用
router.js
const couter = app.middleware.couter()
router.get("/my", couter, controller.my.index)
扩展:
applation扩展:
app/extend/applation.js
module.exports = {
// 方法扩展
currentTime() {
retuen getTime()
}
// 属性扩展
get timeProp {
retuen getTime()
}
}
function getTime() {
let nowTime = new Date()
...
retuen nowTime
}
使用扩展
app/controller/index.js
async index () {
const {ctx, app} = this;
await ctx.render('index.html', {
// 使用扩展方法
nowTime: app.currentTime(),
nowTime2: app.timeProp,
})
}
扩展context
定义扩展
app/extend/context.js
module.exports = {
// 获取请求参数
params(key) {
const method = this.request.method;
if (method === 'GET') {
retuen key ? this,query[key] :this,query
} else {
retuen key ? this.request.body[key]:this.request.body
}
}
}
使用扩展
app/controller/index.js
async index() {
const {ctx} = this
const params = ctx.params()
console.log(params)
ctx.body = 'index'
}
request扩展
定义扩展
app/extend/request.js
module.exports = {
get token() {
return this.get('token')
}
}
使用扩展
app/controller/index.js
async index() {
const {ctx} = this
const token = ctx.request.token
ctx.body = token
}
response扩展
定义扩展
app/extend/response.js
module.exports = {
set token(token) {
this.set('token', token)
}
}
使用扩展
app/controller/index.js
async index() {
const {ctx} = this
ctx.response.token = 'token string'
ctx.body = 'body'
}
helper.js扩展
定义扩展
app/extend/helper.js
module.exports = {
base64Encode(str='') {
retuen new Buffer(str).toString('base64')
}
}
使用扩展
app/controller/index.js
async index() {
const {ctx} = this
ctx.response.token = 'token string'
const base64 = ctx.helper.base64Encode('egg')
ctx.body = base64
}
定时任务app/schedule
新建一个定时任务
// app.schedule/get-time.js
const Subscription = require('egg').Subscription
class GetTime extends Subscription{
static get schedule() {
retuen {
// interval: '3s', // 等价
// cron: '*/3 * * * * *' // 秒、分钟、小时、哪一天(1-31)、月、天(0-7)
type: 'worker'
}
}
aysnc subscribe() {
console.log(Date.noew())
}
}
module.exports = GetTime
mysql 操作
npm i egg-mysql -S
配置
config/plugin.js
exports.mysql = {
enable:true,
package: 'egg-mysql'
}
// config/config.default.js
config.mysql = {
app: true,
agent: false, // 代理
client: {
host: '127.0.0.1',
port: '3306',
user: 'root',
password: 'root',
database: 'test_egg'
}
}
// 操作数据库加 try_catch
// 查
app.mysql.select('表名')
// 增
app.mysql.insert('表名', 参数)
// 修改 param要有id
app.mysql.update('表名', 参数)
// 删除
app.mysql.delete('表名', id)